package com.JapanCustom.controller;

import com.JapanCustom.service.RedisDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class TradeViewController {
    private final RedisDataService redisDataService;
    private final RestTemplate restTemplate;
    @Value("${api.server.url}")
    private String apiServerUrl;

    public TradeViewController(RedisDataService redisDataService, RestTemplate restTemplate) {
        this.redisDataService = redisDataService;
        this.restTemplate = restTemplate;
    }

    // 主页（总体趋势）
    @GetMapping("/")
    public String overallPage(Model model) {
        return "overall";
    }

    // 国家趋势页面
    @GetMapping("/country")
    public String countryPage(Model model) {
        return "country";
    }

    // API2：获取总体预测数据（时间）
//    @GetMapping("/api/predict/overall")
//    @ResponseBody
//    public List<Map<String, Object>> predictOverall() throws Exception {  // 移除参数并调整返回类型
//        // 从Redis获取表2数据（无参数）
//        return redisDataService.getTable2Data();
//    }

    // API1：获取国家预测数据（时间+国家）
//    @GetMapping("/api/predict/country")
//    @ResponseBody
//    public List<Map<String, Object>> predictCountry() throws Exception {  // 移除参数并调整返回类型
//        // 从Redis获取表1数据（无参数）
//        return redisDataService.getTable1Data();
//    }

    // API：获取国家预测数据（调用api_server）
    @PostMapping("/api/predict/country")
    @ResponseBody
    public Map<String, Object> predictCountry(@RequestBody Map<String, String> request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, String>> entity = new HttpEntity<>(request, headers);
        return restTemplate.postForObject(apiServerUrl + "/predict/country", entity, Map.class);
    }

    // API：获取总体预测数据（调用api_server）
    @PostMapping("/api/predict/overall")
    @ResponseBody
    public Map<String, Object> predictOverall(@RequestBody Map<String, String> request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, String>> entity = new HttpEntity<>(request, headers);
        return restTemplate.postForObject(apiServerUrl + "/predict/total", entity, Map.class);
    }

    // 新增：获取总体历史数据接口
    @GetMapping("/api/history/overall")
    @ResponseBody
    public Map<String, Object> getOverallHistory(
        @RequestParam String start, 
        @RequestParam String end
    ) throws Exception {
        List<Map<String, Object>> table2Data = redisDataService.getTable2Data();
        
        List<String> times = new ArrayList<>();
        List<Double> exports = new ArrayList<>();
        List<Double> imports = new ArrayList<>();

        // 按时间范围过滤数据（修改字段名为"日期"）
        table2Data.stream()
            .filter(data -> {
                String time = (String) data.get("日期");  // 原"time"改为"日期"
                return time.compareTo(start) >= 0 && time.compareTo(end) <= 0;
            })
            .sorted((a, b) -> ((String) a.get("日期")).compareTo((String) b.get("日期")))  // 原"time"改为"日期"
            .forEach(data -> {
                times.add((String) data.get("日期"));  // 原"time"改为"日期"
                exports.add(((Number) data.get("出口额")).doubleValue());  // 原"export"改为"出口额"
                imports.add(((Number) data.get("进口额")).doubleValue());  // 原"import"改为"进口额"
            });

        Map<String, Object> result = new HashMap<>();
        result.put("times", times);
        result.put("exports", exports);
        result.put("imports", imports);
        return result;
    }

    // 新增：获取国家历史数据接口
    @GetMapping("/api/history/country")
    @ResponseBody
    public Map<String, Object> getCountryHistory(
        @RequestParam String start, 
        @RequestParam String end,
        @RequestParam String country
    ) throws Exception {
        List<Map<String, Object>> table1Data = redisDataService.getTable1Data();
        
        List<String> times = new ArrayList<>();
        List<Double> exports = new ArrayList<>();
        List<Double> imports = new ArrayList<>();

        // 按时间范围和国家过滤数据（修改字段名为"日期"、"国家标签"）
        table1Data.stream()
            .filter(data -> {
                String time = (String) data.get("日期");  // 原"time"改为"日期"
                String dataCountry = String.valueOf(data.get("国家标签"));  // 关键修复：使用String.valueOf避免类型转换异常
                return time.compareTo(start) >= 0 
                    && time.compareTo(end) <= 0 
                    && dataCountry.equals(country);
            })
            .sorted((a, b) -> ((String) a.get("日期")).compareTo((String) b.get("日期")))  // 原"time"改为"日期"
            .forEach(data -> {
                times.add((String) data.get("日期"));  // 原"time"改为"日期"
                exports.add(((Number) data.get("出口额")).doubleValue());  // 原"export"改为"出口额"
                imports.add(((Number) data.get("进口额")).doubleValue());  // 原"import"改为"进口额"
            });

        Map<String, Object> result = new HashMap<>();
        result.put("times", times);
        result.put("exports", exports);
        result.put("imports", imports);
        return result;
    }
}